﻿#pragma once
#include "Panel.h"

_NAMESPACE_BEGIN


/// 音效描述结构
struct SoundEffect
{
	/// 非默认构造
	SoundEffect(FMOD::System* sys);

	/// 播放
	void Play();

	/// 音效名
	string name;

	/// FMOD声音指针
	FMOD::Sound* sound;
	
	/// FMOD通道
	FMOD::Channel*	channel;
	
	/// FMOD系统
	FMOD::System*	system;

	/// 当前是否播放
	bool isPlaying;

	/// 位置
	Vector3 pos;

	/// 速度
	float speed;
};

//////////////////////////////////////////////////////////////////////////

/// 使用fmod声音引擎封装的简易音效库

class SoundTool : public Panel
{
public:

	/// 单体类声明
	SINGLETON_HELPER(SoundTool)

	SoundTool();

	virtual ~SoundTool();

public:

	/// 挂接到游戏内核的重写函数，实现声音部分的每帧更新
	void Update(/*CONST_REF(Vector3) lisPos*/);

	/// 增加新的音效，并返回音效结构指针
	/// \param[in] fileName 音效文件路径
	/// \return 音效指针
	SoundEffect* AddNewSound(CONST_REF(string) fileName);

	/// 设置听者位置
	/// \param[in] lisPos 听者的位置向量
	void SetListenerPos(CONST_REF(Vector3) lisPos);

protected:

	/// 检查FMOD相关方法是否发生调用错误
	inline void ERRCHECK(FMOD_RESULT result)
	{
		if (result != FMOD_OK)
		{
			string error = "FMOD 错误! :";
			error += result;
			error += FMOD_ErrorString(result);
			SAVE_LOG(error);
			#ifdef NR_DEBUG
				__asm int 3
			#endif
		}
	}
	
	/// 初始化FMOD音效引擎
	bool	InitialFMOD();

	/// 播放声音
	void	PlaySound();

protected:

	/// FMOD系统接口
	FMOD::System    *system;		

	/// FMOD版本号
	unsigned int     version;		

	/// 本机声卡个数
	int		numdrivers;				

	/// 硬件标记
	FMOD_CAPS        caps;			

	/// 发声模式
	FMOD_SPEAKERMODE speakermode;	

	char             name[256];

	/// 听者 50ms更新
	int   INTERFACE_UPDATETIME;     

	/// 单位是米
	float DISTANCEFACTOR;			
		
	/// 更新用的时间控制对象
	Clock clock;					

	/// 听者位置，一个运行的程序只有一个听者
	FMOD_VECTOR      listenerpos;	

	/// 音效列表
	std::vector<SoundEffect*> soundList;	
};

_NAMESPACE_END